package com.wuwei.tms.workbench.service.impl;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wuwei.tms.exception.TmsException;
import com.wuwei.tms.pojo.Borrow;
import com.wuwei.tms.pojo.Tool;
import com.wuwei.tms.setting.mapper.UserMapper;
import com.wuwei.tms.utils.result.Result;
import com.wuwei.tms.workbench.mapper.BorrowMapper;
import com.wuwei.tms.workbench.mapper.ToolMapper;
import com.wuwei.tms.workbench.service.ToolService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

@Service
public class ToolServiceImpl implements ToolService {

    @Resource
    private ToolMapper toolMapper;

    @Resource
    private BorrowMapper borrowMapper;


    //获取所有校验日期在一个月以内的计量工具
    @Override
    public List<Tool> getUnUsedTool() {
        List<Tool> tools = toolMapper.getUnUsedTool();
        return tools;
    }

    @Override
    @Transactional
    public Result<String> update(Tool tool) {
        //这里如果对工具编号的barcode有所修改，则需要去数据库查看修改后的barcode是否会重复
        Long oldBarcode = toolMapper.selectById(tool.getId()).getBarcode();
        if (!tool.getBarcode().equals(oldBarcode)) {//如果前端传来的barcode和数据库的原来的barcode不一样，则表明修改了barcode
            LambdaQueryWrapper<Tool> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(Tool::getBarcode,tool.getBarcode());
            if (toolMapper.selectCount(queryWrapper)!=0) {
                return Result.fail("工具编号重复！");
            }
        }

        //检查该工具在数据库里是什么状态，获取数据库中的该工具
        Tool selected = toolMapper.selectById(tool.getId());

        //如果barcode修改了，而该工具有未归还，则不能修改，否则下一个人来就无法归还工具了
        if (!tool.getBarcode().equals(selected.getBarcode())) {
            LambdaQueryWrapper<Borrow> wrapper = new LambdaQueryWrapper<>();
            //这里需要用selected的也就是数据库里的tool的barcode，因为前端端过来的barcode可能有过修改
            wrapper.eq(Borrow::getBarcode,selected.getBarcode());
            List<Borrow> borrowList = borrowMapper.selectList(wrapper);
            if (borrowList.size()>0) {//如果在t_borrow表中查到有和该工具有关的记录，表明该工具还有人在借出去使用，则不能归还
                Long borrowById = borrowList.get(0).getBorrowById();
                return Result.fail("该工具工号为"+borrowById+"的员工未归还，更新失败！");
            }
        }
          /*
        如果是消耗品或航材，当改变消耗品的数量时，工具总数改变了多少，工具库内总数也要改变多少
        比如当工具总数是10，库内数量是5，代表一共有10个工具，借出去5个，库房内还有5个
        此时当工具总数变成了12，代表增加了2件工具，此时库内数量也要增加2
        这里要注意，当工具总数减少时，代表工具数量减少了，但是此时要注意不能让库内数量减少到小于0
         */

        Integer allNumber = tool.getAllNumber();
        if (tool.getConsumeFlag()==3||tool.getConsumeFlag()==4) {
            Integer allNumber1 = selected.getAllNumber();//查出原来工具的总数
            Integer userAbleNum = selected.getUserableNum();//查出库内工具的总数
            /*
            表中原来的库内工具总数等于修改后的工具总数减去修改前的表内的工具总数
            比如：表内原来的库内工具总数为5，工具总数是10。此时将工具总数更新成12，那么表内的库内工具总数就要修改成5+12-10=7
             */
            int updateUserAbleNum = userAbleNum + allNumber - allNumber1;
            if (updateUserAbleNum<0) {
                return Result.fail("更新失败！库内工具总数不能小于0！");
            } tool.setUserableNum(updateUserAbleNum);
        }
        else {
            /*
            如果更新成非消耗品或航材要看两种情况
            1.原来该工具就是消耗品或航材，改成非消耗品或航材，此时要检查是否所有工具都已归还
            也就是工具总数要等于库存数，如果工具总数不等于库存数表明有工具未归还，此时是不能更新的
            2.如果原来工具不是消耗品或航材，那么不需要检查什么，直接更新即可
             */

            Integer consumeFlag = selected.getConsumeFlag();
            //如果原来该工具就是消耗品或航材，改成非消耗品或航材
            if (consumeFlag==3||consumeFlag==4) {
                //检查是否所有工具都已归还
                //消耗品或航材当改成常用工具或者计量工具时，此时数量会变成1，因此需要把所有借出去的工具都还回来
                //因此需要检查该工具是否都已经还回来了
                //去t_borrow表中查有无和该工具有关的记录
                LambdaQueryWrapper<Borrow> queryWrapper = new LambdaQueryWrapper<>();
                //这里需要用selected的也就是数据库里的tool的barcode，因为前端端过来的barcode可能有过修改
                queryWrapper.eq(Borrow::getBarcode,selected.getBarcode());
                List<Borrow> borrowList = borrowMapper.selectList(queryWrapper);
                if (borrowList.size()>0) {//如果在t_borrow表中查到有和该工具有关的记录，表明该工具还有人在借出去使用，则不能归还
                    Long borrowById = borrowList.get(0).getBorrowById();
                    return Result.fail("该工具工号为"+borrowById+"的员工未归还，更新失败！");
                }
                //如果所有工具都以及归还，而此时修改成非消耗品或者非航材的话，需要把传来的tool的可用数量useableNum也改成1
                tool.setUserableNum(1);
            }
            //如果原来该工具就不是消耗品或者航材，那么他在数据库里的可用数量就是1，那么不影响，不需要做什么操作
        }

        toolMapper.updateById(tool);
        return Result.ok("更新成功");
    }
}
